package com.sxt;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;


//创建后继承JFrame类这样才有创建窗口监听鼠标事件的功能
public class GameWin extends JFrame {

    //  状态   0未开始 1运行中 2商店 3失败 4胜利
    static int state;//静态变量

    List<Object> objectList = new ArrayList<>(); //存取金块石块
    Bg bg = new Bg();
    Line line = new Line(this); //传入参数
//    Gold gold = new Gold(); //添加金块

    {
        //是否可以放置
        boolean isPlace = true;
        for (int i = 0; i < 11; i++) {           //添加金块
            double random = Math.random();//Math随机数
            Gold gold;//存放当前生成的金块
            if (random<0.3){gold = new GoldMini();}
            else if(random<0.7){gold = new Gold();}
            else {gold = new GoldPlus();}
//   objectList.add(new Gold());
            for(Object obj:objectList){                         //判断金块是否与物体重叠
                if (gold.getRec().intersects(obj.getRec())){
                    //不可放置，需要重新生成
                    isPlace = false;          //参数就为false
                }
            }
            if (isPlace){objectList.add(gold);}   //那么参数就重新循环一下 i--
            else {isPlace = true;i--;}
        }

        for (int i = 0; i < 5; i++) {           //添加石块
            Rock rock = new Rock();
            for (Object obj:objectList) {                           //判断石块是否与物体重叠
                if (rock.getRec().intersects(obj.getRec())) {
                    //不可放置，需要重新生成
                isPlace = false;              //参数就为false
                }
            }                                                           //重合了就进行循环
            if (isPlace) { objectList.add(rock); }                  //那么参数就重新循环一下 i--
            else {isPlace = true;i--;}
        }
    }


    Image offScreenImage;//定义新画布

   void launch(){
       System.out.println(bg);//创建launch方法初始化窗口信息
        this.setVisible(true);//窗口是否可见
        this.setSize(768,950);//窗口大小
        this.setLocationRelativeTo(null);//窗口位置
        this.setTitle("黄金矿工");//窗口标题
       //一个关闭窗口的方法
       setDefaultCloseOperation(EXIT_ON_CLOSE);

       //设置鼠标事件
       addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               super.mouseClicked(e);                      //鼠标点击事件
               switch (state){
                   case 0:
                       if (e.getButton()==3){state=1;}     //准备状态   如果点击鼠标右键则进入 开始游戏
                       bg.startTime = System.currentTimeMillis();       //添加一个重置时间
                       break;
                   case 1:
                       //左右摇摆，点击左键
                       if (e.getButton()==1&&line.state==0)
                       {line.state=1;}
                       //抓取返回，点击右键
                       if (e.getButton()==3&&line.state==3&&Bg.waterNum>0){
                           Bg.waterFlag=true;//右键点击状态改变为tiue  默认为false见Bg.java
                           Bg.waterNum--;//药水数量减一xxxxxxxxxxxxxxxxxxxxxx
                       }
                       break;
                   case 2:
                       if (e.getButton()==1){         //点击左键购买
                           bg.shop=true;
                       }
                       if (e.getButton()==3){         //右键直接进入下一个
                           state=1;
                           bg.startTime = System.currentTimeMillis();     //添加一个重置时间
                       }
                       break;
                   case 3:

                   case 4:
                       if (e.getButton()==1){
                           state=0;
                           bg.reGame();
                           line.reGame();
                       }
                       break;
                   default:

               }
           }
       });

       //添加一个死循环
       while (true) {         // 循环
           repaint();         //repaint 重新绘制
            nextLevel();    //调用nextLevel类

           try {
               Thread.sleep(10);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }

   //下一关
   public void nextLevel(){
       if (bg.gameTime() && state==1){                         //在游戏运行当中才运行下一关
           if (Bg.count>bg.goal)
           {
               if (Bg.level==5){state=4;}             //如果达到五关则进入（状态4）成功状态
               else{
                   state=2;
                   Bg.level++;                       //反之   条件达成 继续进行下一关
               }
           }else {state = 3;}                     //失败则进行状态3
           dispose();
           GameWin gameWin = new GameWin();         //每次进入下一关都可以重置石块和金块
           gameWin.launch();
       }
   }

    @Override
    public void paint(Graphics g) {
       offScreenImage = this.createImage(768,950); //调用画布的方法
        Graphics gImage = offScreenImage.getGraphics(); //给这个画布调用一个画笔gImage

        bg.painSelf(gImage);        //调用背景了一个Bg.java的bg类的painSelf方法
        /*  gold.pintSelf(gImage);      //调用金子Gold.java的gold类的painSelf方法*/

        if(state==1){
            /*绘制物体和绘制线只会在游戏中才进行绘制*/
            //绘制物体
            for(Object obj:objectList)      // Object 本身有调用自己的方法 用来调用金子
            {
                obj.pintSelf(gImage);
            }
            //绘制线
            line.painSelf(gImage);       //调用红线Line.java的line类的painSelf方法

        }

        g.drawImage(offScreenImage,0,0,null); //给这个画布坐标
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();
    }

}
